package com.atguigu.exam.controller;

import com.atguigu.exam.common.Result;
import com.atguigu.exam.entity.Notice;
import com.atguigu.exam.service.NoticeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 公告控制器 - 处理系统公告管理相关的HTTP请求
 * 包括公告的增删改查、状态管理、前台展示等功能
 */
@RestController  // REST控制器，返回JSON数据
@RequestMapping("/api/notices")  // 公告API路径前缀
@CrossOrigin  // 允许跨域访问
@Slf4j
@Tag(name = "公告管理", description = "系统公告相关操作，包括公告发布、编辑、删除、状态管理等功能")  // Swagger API分组
public class NoticeController {
    @Autowired
    private NoticeService noticeService;

    /**
     * 获取所有公告接口
     *
     * @return
     */
    @GetMapping("/list")
    @Operation(summary = "获取所有公告接口", description = "获取所有公告列表，包括启用和禁用的，供管理后台使用")
    //获取所有公告
    public Result<List<Notice>> getAllNotices() {
        //查询所有公告
        List<Notice> list = noticeService.getAllNotices();
        //返回结果
        return Result.success(list, "获取所有公告成功");
    }

    /**
     * 获取最新公告
     *
     * @param limit
     * @return
     */

    @GetMapping("/latest")
    @Operation(summary = "获取最新公告", description = "获取最新发布的公告列表，用于首页推荐展示")
    public Result<List<Notice>> getLatestNotice(Integer limit) {
        //查询limit条最新的公告
        List<Notice> list = noticeService.getLatestNotice(limit);
        //输出日志
        log.info("获取最新公告成功,获取的结果为：{}", list);
        //返回结果
        return Result.success(list, "获取最新公告成功");
    }

    /**
     * 获取启用公告
     *
     * @return
     */
    @GetMapping("/active")
    @Operation(summary = "获取启用的公告", description = "获取状态为启用的公告列表，供前台首页展示使用")
    public Result<List<Notice>> getActiveNotice() {
        //查询激活状态下的公告
        List<Notice> list = noticeService.getActiveNotice();
        //输出日志
        log.info("获取启用的公告成功，获取的结果为：{}", list);
        //返回结果
        return Result.success(list, "获取启用公告成功");
    }

    @GetMapping("{id}")
    @Operation(summary = "根据id获取公告", description = "根据公告ID获取单个公告的详细信息")
    public Result<Notice> getNoticeById(@PathVariable Integer id) {
        //调用service根据id获取公告
        Notice notice = noticeService.getNoticeById(id);
        //输出日志
        log.info("根据id:{}获取公告成功,获取的公告为：{}", id, notice);
        //返回结果
        return Result.success(notice, "获取公告成功");
    }

    /**
     * 发布新公告
     *
     * @param notice
     * @return
     */
    @PostMapping("/add")
    @Operation(summary = "发布新公告", description = "创建并发布新的系统公告")
    public Result<String> addNotice(@RequestBody Notice notice) {
        //添加公告
        noticeService.addNotice(notice);
        //返回结果
        return Result.success("发表新公告成功");
    }

    /**
     * 更新公告信息
     *
     * @param notice
     * @return
     */
    @PutMapping("/update")
    @Operation(summary = "更新公告信息", description = "修改公告的内容、标题、类型等信息")
    public Result<String> updateNotice(@RequestBody Notice notice) {
        //输出参数
        log.info("更新公共信息接受到的参数为:{}", notice);
        //更新公告
        noticeService.updateNotice(notice);
        //返回结果
        return Result.success("更新公告信息成功");
    }

    /**
     * 切换公告状态
     * @param id
     * @param isActive
     * @return
     */

    @PutMapping("/toggle/{id}")
    @Operation(summary = "切换公告状态", description = "启用或禁用指定的公告，禁用后不会在前台显示")
    public Result<String> updateNoticeStatus(@PathVariable Integer id, @RequestParam Boolean isActive) {
        //输出参数
        log.info("切换公告状态接受到的参数为:id={},isActice={}", id, isActive);
        //切换公告状态
        noticeService.updateNoticeStatus(id, isActive);
        //返回结果
        return Result.success("切换公告状态成功!");
    }

    @DeleteMapping("/delete/{id}")
    @Operation(summary = "删除公告",description = "根据ID删除指定的公告")
    public Result<String> deleteNotice(@PathVariable Long id) {
        //输出参数
        log.info("删除公告接受到的参数为:id={}", id);
        //删除公告
        noticeService.deleteNotice(id);
        //返回结果
        return Result.success("删除公告成功!");
    }

} 